Fix line length calculation for interactive prompt#613
Merged
Conversation
ashleygwilliams
approved these changes
Dec 10, 2025
donk-shopify
approved these changes
Dec 10, 2025
sambostock
pushed a commit
that referenced
this pull request
Feb 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
When using
CLI::UI::Prompt.askwith options that contain OSC 8 hyperlinks (created viaCLI::UI.link), the interactive options display would become corrupted when navigating between options. Lines would appear duplicated or misaligned.Screen.Recording.2025-12-09.at.3.22.40.PM.mov
Cause
The
calculate_option_line_lengthsmethod was using string length (.length) to determine how many terminal lines each option would occupy. However, OSC 8 hyperlinks contain ~50 invisible escape sequence characters that don't contribute to display width. This caused the line count to be significantly overestimated.For example, at terminal width 40:
.length: 60 / 40 = 2 lines (incorrect)printing_width: 15 / 40 = 1 line (correct)The incorrect line count caused
reset_positionto move the cursor too far, resulting in visual corruption during redraws.Solution
Changed line length calculation to use
CLI::UI::ANSI.printing_width, which correctly strips ANSI escape sequences (including OSC 8 hyperlinks) before calculating display width.Testing
Added a regression test that: